/*
 * Copyright 2022 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.shell.support.search;

import java.util.HashMap;
import java.util.Map;

public class Normalize {

	public static Map<Character, Character> normalized = new HashMap<>();

	static {
		normalized.put((char)0x00E1, 'a'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0103, 'a'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x01CE, 'a'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x00E2, 'a'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x00E4, 'a'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x0227, 'a'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1EA1, 'a'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0201, 'a'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x00E0, 'a'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1EA3, 'a'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x0203, 'a'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x0101, 'a'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x0105, 'a'); //  WITH OGONEK, LATIN SMALL LETTER
		normalized.put((char)0x1E9A, 'a'); //  WITH RIGHT HALF RING, LATIN SMALL LETTER
		normalized.put((char)0x00E5, 'a'); //  WITH RING ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E01, 'a'); //  WITH RING BELOW, LATIN SMALL LETTER
		normalized.put((char)0x00E3, 'a'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x0363, 'a'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0250, 'a'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1E03, 'b'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E05, 'b'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0253, 'b'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E07, 'b'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0180, 'b'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x0183, 'b'); //  WITH TOPBAR, LATIN SMALL LETTER
		normalized.put((char)0x0107, 'c'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x010D, 'c'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x00E7, 'c'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x0109, 'c'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x0255, 'c'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x010B, 'c'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x0188, 'c'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x023C, 'c'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x0368, 'c'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0297, 'c'); //  , LATIN LETTER STRETCHED
		normalized.put((char)0x2184, 'c'); //  , LATIN SMALL LETTER REVERSED
		normalized.put((char)0x010F, 'd'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x1E11, 'd'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E13, 'd'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0221, 'd'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x1E0B, 'd'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E0D, 'd'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0257, 'd'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E0F, 'd'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0111, 'd'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x0256, 'd'); //  WITH TAIL, LATIN SMALL LETTER
		normalized.put((char)0x018C, 'd'); //  WITH TOPBAR, LATIN SMALL LETTER
		normalized.put((char)0x0369, 'd'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x00E9, 'e'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0115, 'e'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x011B, 'e'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0229, 'e'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E19, 'e'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x00EA, 'e'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x00EB, 'e'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x0117, 'e'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1EB9, 'e'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0205, 'e'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x00E8, 'e'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1EBB, 'e'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x025D, 'e'); //  WITH HOOK, LATIN SMALL LETTER REVERSED OPEN
		normalized.put((char)0x0207, 'e'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x0113, 'e'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x0119, 'e'); //  WITH OGONEK, LATIN SMALL LETTER
		normalized.put((char)0x0247, 'e'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x1E1B, 'e'); //  WITH TILDE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x1EBD, 'e'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x0364, 'e'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x029A, 'e'); //  , LATIN SMALL LETTER CLOSED OPEN
		normalized.put((char)0x025E, 'e'); //  , LATIN SMALL LETTER CLOSED REVERSED OPEN
		normalized.put((char)0x025B, 'e'); //  , LATIN SMALL LETTER OPEN
		normalized.put((char)0x0258, 'e'); //  , LATIN SMALL LETTER REVERSED
		normalized.put((char)0x025C, 'e'); //  , LATIN SMALL LETTER REVERSED OPEN
		normalized.put((char)0x01DD, 'e'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1D08, 'e'); //  , LATIN SMALL LETTER TURNED OPEN
		normalized.put((char)0x1E1F, 'f'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x0192, 'f'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x01F5, 'g'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x011F, 'g'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x01E7, 'g'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0123, 'g'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x011D, 'g'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x0121, 'g'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x0260, 'g'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E21, 'g'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x01E5, 'g'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x0261, 'g'); //  , LATIN SMALL LETTER SCRIPT
		normalized.put((char)0x1E2B, 'h'); //  WITH BREVE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x021F, 'h'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x1E29, 'h'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x0125, 'h'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x1E27, 'h'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1E23, 'h'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E25, 'h'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x02AE, 'h'); //  WITH FISHHOOK, LATIN SMALL LETTER TURNED
		normalized.put((char)0x0266, 'h'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E96, 'h'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0127, 'h'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x036A, 'h'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0265, 'h'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x2095, 'h'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x00ED, 'i'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x012D, 'i'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x01D0, 'i'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x00EE, 'i'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x00EF, 'i'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1ECB, 'i'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0209, 'i'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x00EC, 'i'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1EC9, 'i'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x020B, 'i'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x012B, 'i'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x012F, 'i'); //  WITH OGONEK, LATIN SMALL LETTER
		normalized.put((char)0x0268, 'i'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x1E2D, 'i'); //  WITH TILDE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0129, 'i'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x0365, 'i'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0131, 'i'); //  , LATIN SMALL LETTER DOTLESS
		normalized.put((char)0x1D09, 'i'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1D62, 'i'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x2071, 'i'); //  , SUPERSCRIPT LATIN SMALL LETTER
		normalized.put((char)0x01F0, 'j'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0135, 'j'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x029D, 'j'); //  WITH CROSSED-TAIL, LATIN SMALL LETTER
		normalized.put((char)0x0249, 'j'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x025F, 'j'); //  WITH STROKE, LATIN SMALL LETTER DOTLESS
		normalized.put((char)0x0237, 'j'); //  , LATIN SMALL LETTER DOTLESS
		normalized.put((char)0x1E31, 'k'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x01E9, 'k'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0137, 'k'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E33, 'k'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0199, 'k'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E35, 'k'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x029E, 'k'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x2096, 'k'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x013A, 'l'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x019A, 'l'); //  WITH BAR, LATIN SMALL LETTER
		normalized.put((char)0x026C, 'l'); //  WITH BELT, LATIN SMALL LETTER
		normalized.put((char)0x013E, 'l'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x013C, 'l'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E3D, 'l'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0234, 'l'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x1E37, 'l'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x1E3B, 'l'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0140, 'l'); //  WITH MIDDLE DOT, LATIN SMALL LETTER
		normalized.put((char)0x026B, 'l'); //  WITH MIDDLE TILDE, LATIN SMALL LETTER
		normalized.put((char)0x026D, 'l'); //  WITH RETROFLEX HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0142, 'l'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x2097, 'l'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x1E3F, 'm'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x1E41, 'm'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E43, 'm'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0271, 'm'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0270, 'm'); //  WITH LONG LEG, LATIN SMALL LETTER TURNED
		normalized.put((char)0x036B, 'm'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x1D1F, 'm'); //  , LATIN SMALL LETTER SIDEWAYS TURNED
		normalized.put((char)0x026F, 'm'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x2098, 'm'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x0144, 'n'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0148, 'n'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0146, 'n'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E4B, 'n'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0235, 'n'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x1E45, 'n'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E47, 'n'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x01F9, 'n'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x0272, 'n'); //  WITH LEFT HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E49, 'n'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x019E, 'n'); //  WITH LONG RIGHT LEG, LATIN SMALL LETTER
		normalized.put((char)0x0273, 'n'); //  WITH RETROFLEX HOOK, LATIN SMALL LETTER
		normalized.put((char)0x00F1, 'n'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x2099, 'n'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x00F3, 'o'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x014F, 'o'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x01D2, 'o'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x00F4, 'o'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x00F6, 'o'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x022F, 'o'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1ECD, 'o'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0151, 'o'); //  WITH DOUBLE ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x020D, 'o'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x00F2, 'o'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1ECF, 'o'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x01A1, 'o'); //  WITH HORN, LATIN SMALL LETTER
		normalized.put((char)0x020F, 'o'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x014D, 'o'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x01EB, 'o'); //  WITH OGONEK, LATIN SMALL LETTER
		normalized.put((char)0x00F8, 'o'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x1D13, 'o'); //  WITH STROKE, LATIN SMALL LETTER SIDEWAYS
		normalized.put((char)0x00F5, 'o'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x0366, 'o'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0275, 'o'); //  , LATIN SMALL LETTER BARRED
		normalized.put((char)0x1D17, 'o'); //  , LATIN SMALL LETTER BOTTOM HALF
		normalized.put((char)0x0254, 'o'); //  , LATIN SMALL LETTER OPEN
		normalized.put((char)0x1D11, 'o'); //  , LATIN SMALL LETTER SIDEWAYS
		normalized.put((char)0x1D12, 'o'); //  , LATIN SMALL LETTER SIDEWAYS OPEN
		normalized.put((char)0x1D16, 'o'); //  , LATIN SMALL LETTER TOP HALF
		normalized.put((char)0x1E55, 'p'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x1E57, 'p'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x01A5, 'p'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x209A, 'p'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x024B, 'q'); //  WITH HOOK TAIL, LATIN SMALL LETTER
		normalized.put((char)0x02A0, 'q'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0155, 'r'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0159, 'r'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0157, 'r'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E59, 'r'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E5B, 'r'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0211, 'r'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x027E, 'r'); //  WITH FISHHOOK, LATIN SMALL LETTER
		normalized.put((char)0x027F, 'r'); //  WITH FISHHOOK, LATIN SMALL LETTER REVERSED
		normalized.put((char)0x027B, 'r'); //  WITH HOOK, LATIN SMALL LETTER TURNED
		normalized.put((char)0x0213, 'r'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x1E5F, 'r'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x027C, 'r'); //  WITH LONG LEG, LATIN SMALL LETTER
		normalized.put((char)0x027A, 'r'); //  WITH LONG LEG, LATIN SMALL LETTER TURNED
		normalized.put((char)0x024D, 'r'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x027D, 'r'); //  WITH TAIL, LATIN SMALL LETTER
		normalized.put((char)0x036C, 'r'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0279, 'r'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1D63, 'r'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x015B, 's'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0161, 's'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x015F, 's'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x015D, 's'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x0219, 's'); //  WITH COMMA BELOW, LATIN SMALL LETTER
		normalized.put((char)0x1E61, 's'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E9B, 's'); //  WITH DOT ABOVE, LATIN SMALL LETTER LONG
		normalized.put((char)0x1E63, 's'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0282, 's'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x023F, 's'); //  WITH SWASH TAIL, LATIN SMALL LETTER
		normalized.put((char)0x017F, 's'); //  , LATIN SMALL LETTER LONG
		normalized.put((char)0x00DF, 's'); //  , LATIN SMALL LETTER SHARP
		normalized.put((char)0x209B, 's'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x0165, 't'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x0163, 't'); //  WITH CEDILLA, LATIN SMALL LETTER
		normalized.put((char)0x1E71, 't'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x021B, 't'); //  WITH COMMA BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0236, 't'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x1E97, 't'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1E6B, 't'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E6D, 't'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x01AD, 't'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E6F, 't'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x01AB, 't'); //  WITH PALATAL HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0288, 't'); //  WITH RETROFLEX HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0167, 't'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x036D, 't'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x0287, 't'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x209C, 't'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x0289, 'u'); //  BAR, LATIN SMALL LETTER
		normalized.put((char)0x00FA, 'u'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x016D, 'u'); //  WITH BREVE, LATIN SMALL LETTER
		normalized.put((char)0x01D4, 'u'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x1E77, 'u'); //  WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER
		normalized.put((char)0x00FB, 'u'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x1E73, 'u'); //  WITH DIAERESIS BELOW, LATIN SMALL LETTER
		normalized.put((char)0x00FC, 'u'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1EE5, 'u'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0171, 'u'); //  WITH DOUBLE ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0215, 'u'); //  WITH DOUBLE GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x00F9, 'u'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1EE7, 'u'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x01B0, 'u'); //  WITH HORN, LATIN SMALL LETTER
		normalized.put((char)0x0217, 'u'); //  WITH INVERTED BREVE, LATIN SMALL LETTER
		normalized.put((char)0x016B, 'u'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x0173, 'u'); //  WITH OGONEK, LATIN SMALL LETTER
		normalized.put((char)0x016F, 'u'); //  WITH RING ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E75, 'u'); //  WITH TILDE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0169, 'u'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x0367, 'u'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x1D1D, 'u'); //  , LATIN SMALL LETTER SIDEWAYS
		normalized.put((char)0x1D1E, 'u'); //  , LATIN SMALL LETTER SIDEWAYS DIAERESIZED
		normalized.put((char)0x1D64, 'u'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x1E7F, 'v'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x028B, 'v'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E7D, 'v'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x036E, 'v'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x028C, 'v'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1D65, 'v'); //  , LATIN SUBSCRIPT SMALL LETTER
		normalized.put((char)0x1E83, 'w'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0175, 'w'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x1E85, 'w'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1E87, 'w'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E89, 'w'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x1E81, 'w'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1E98, 'w'); //  WITH RING ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x028D, 'w'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x1E8D, 'x'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1E8B, 'x'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x036F, 'x'); //  , COMBINING LATIN SMALL LETTER
		normalized.put((char)0x00FD, 'y'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x0177, 'y'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x00FF, 'y'); //  WITH DIAERESIS, LATIN SMALL LETTER
		normalized.put((char)0x1E8F, 'y'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1EF5, 'y'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x1EF3, 'y'); //  WITH GRAVE, LATIN SMALL LETTER
		normalized.put((char)0x1EF7, 'y'); //  WITH HOOK ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x01B4, 'y'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x0233, 'y'); //  WITH MACRON, LATIN SMALL LETTER
		normalized.put((char)0x1E99, 'y'); //  WITH RING ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x024F, 'y'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x1EF9, 'y'); //  WITH TILDE, LATIN SMALL LETTER
		normalized.put((char)0x028E, 'y'); //  , LATIN SMALL LETTER TURNED
		normalized.put((char)0x017A, 'z'); //  WITH ACUTE, LATIN SMALL LETTER
		normalized.put((char)0x017E, 'z'); //  WITH CARON, LATIN SMALL LETTER
		normalized.put((char)0x1E91, 'z'); //  WITH CIRCUMFLEX, LATIN SMALL LETTER
		normalized.put((char)0x0291, 'z'); //  WITH CURL, LATIN SMALL LETTER
		normalized.put((char)0x017C, 'z'); //  WITH DOT ABOVE, LATIN SMALL LETTER
		normalized.put((char)0x1E93, 'z'); //  WITH DOT BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0225, 'z'); //  WITH HOOK, LATIN SMALL LETTER
		normalized.put((char)0x1E95, 'z'); //  WITH LINE BELOW, LATIN SMALL LETTER
		normalized.put((char)0x0290, 'z'); //  WITH RETROFLEX HOOK, LATIN SMALL LETTER
		normalized.put((char)0x01B6, 'z'); //  WITH STROKE, LATIN SMALL LETTER
		normalized.put((char)0x0240, 'z'); //  WITH SWASH TAIL, LATIN SMALL LETTER
		normalized.put((char)0x0251, 'a'); //  , latin small letter script
		normalized.put((char)0x00C1, 'A'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x00C2, 'A'); //  WITH CIRCUMFLEX, LATIN CAPITAL LETTER
		normalized.put((char)0x00C4, 'A'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x00C0, 'A'); //  WITH GRAVE, LATIN CAPITAL LETTER
		normalized.put((char)0x00C5, 'A'); //  WITH RING ABOVE, LATIN CAPITAL LETTER
		normalized.put((char)0x023A, 'A'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x00C3, 'A'); //  WITH TILDE, LATIN CAPITAL LETTER
		normalized.put((char)0x1D00, 'A'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0181, 'B'); //  WITH HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x0243, 'B'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x0299, 'B'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D03, 'B'); //  , LATIN LETTER SMALL CAPITAL BARRED
		normalized.put((char)0x00C7, 'C'); //  WITH CEDILLA, LATIN CAPITAL LETTER
		normalized.put((char)0x023B, 'C'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x1D04, 'C'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x018A, 'D'); //  WITH HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x0189, 'D'); //  , LATIN CAPITAL LETTER AFRICAN
		normalized.put((char)0x1D05, 'D'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x00C9, 'E'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x00CA, 'E'); //  WITH CIRCUMFLEX, LATIN CAPITAL LETTER
		normalized.put((char)0x00CB, 'E'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x00C8, 'E'); //  WITH GRAVE, LATIN CAPITAL LETTER
		normalized.put((char)0x0246, 'E'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x0190, 'E'); //  , LATIN CAPITAL LETTER OPEN
		normalized.put((char)0x018E, 'E'); //  , LATIN CAPITAL LETTER REVERSED
		normalized.put((char)0x1D07, 'E'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0193, 'G'); //  WITH HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x029B, 'G'); //  WITH HOOK, LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0262, 'G'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x029C, 'H'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x00CD, 'I'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x00CE, 'I'); //  WITH CIRCUMFLEX, LATIN CAPITAL LETTER
		normalized.put((char)0x00CF, 'I'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x0130, 'I'); //  WITH DOT ABOVE, LATIN CAPITAL LETTER
		normalized.put((char)0x00CC, 'I'); //  WITH GRAVE, LATIN CAPITAL LETTER
		normalized.put((char)0x0197, 'I'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x026A, 'I'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0248, 'J'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x1D0A, 'J'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D0B, 'K'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x023D, 'L'); //  WITH BAR, LATIN CAPITAL LETTER
		normalized.put((char)0x1D0C, 'L'); //  WITH STROKE, LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x029F, 'L'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x019C, 'M'); //  , LATIN CAPITAL LETTER TURNED
		normalized.put((char)0x1D0D, 'M'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x019D, 'N'); //  WITH LEFT HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x0220, 'N'); //  WITH LONG RIGHT LEG, LATIN CAPITAL LETTER
		normalized.put((char)0x00D1, 'N'); //  WITH TILDE, LATIN CAPITAL LETTER
		normalized.put((char)0x0274, 'N'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D0E, 'N'); //  , LATIN LETTER SMALL CAPITAL REVERSED
		normalized.put((char)0x00D3, 'O'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x00D4, 'O'); //  WITH CIRCUMFLEX, LATIN CAPITAL LETTER
		normalized.put((char)0x00D6, 'O'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x00D2, 'O'); //  WITH GRAVE, LATIN CAPITAL LETTER
		normalized.put((char)0x019F, 'O'); //  WITH MIDDLE TILDE, LATIN CAPITAL LETTER
		normalized.put((char)0x00D8, 'O'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x00D5, 'O'); //  WITH TILDE, LATIN CAPITAL LETTER
		normalized.put((char)0x0186, 'O'); //  , LATIN CAPITAL LETTER OPEN
		normalized.put((char)0x1D0F, 'O'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D10, 'O'); //  , LATIN LETTER SMALL CAPITAL OPEN
		normalized.put((char)0x1D18, 'P'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x024A, 'Q'); //  WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL
		normalized.put((char)0x024C, 'R'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x0280, 'R'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0281, 'R'); //  , LATIN LETTER SMALL CAPITAL INVERTED
		normalized.put((char)0x1D19, 'R'); //  , LATIN LETTER SMALL CAPITAL REVERSED
		normalized.put((char)0x1D1A, 'R'); //  , LATIN LETTER SMALL CAPITAL TURNED
		normalized.put((char)0x023E, 'T'); //  WITH DIAGONAL STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x01AE, 'T'); //  WITH RETROFLEX HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x1D1B, 'T'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x0244, 'U'); //  BAR, LATIN CAPITAL LETTER
		normalized.put((char)0x00DA, 'U'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x00DB, 'U'); //  WITH CIRCUMFLEX, LATIN CAPITAL LETTER
		normalized.put((char)0x00DC, 'U'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x00D9, 'U'); //  WITH GRAVE, LATIN CAPITAL LETTER
		normalized.put((char)0x1D1C, 'U'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x01B2, 'V'); //  WITH HOOK, LATIN CAPITAL LETTER
		normalized.put((char)0x0245, 'V'); //  , LATIN CAPITAL LETTER TURNED
		normalized.put((char)0x1D20, 'V'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D21, 'W'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x00DD, 'Y'); //  WITH ACUTE, LATIN CAPITAL LETTER
		normalized.put((char)0x0178, 'Y'); //  WITH DIAERESIS, LATIN CAPITAL LETTER
		normalized.put((char)0x024E, 'Y'); //  WITH STROKE, LATIN CAPITAL LETTER
		normalized.put((char)0x028F, 'Y'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put((char)0x1D22, 'Z'); //  , LATIN LETTER SMALL CAPITAL
		normalized.put('Ắ', 'A');
		normalized.put('Ấ', 'A');
		normalized.put('Ằ', 'A');
		normalized.put('Ầ', 'A');
		normalized.put('Ẳ', 'A');
		normalized.put('Ẩ', 'A');
		normalized.put('Ẵ', 'A');
		normalized.put('Ẫ', 'A');
		normalized.put('Ặ', 'A');
		normalized.put('Ậ', 'A');
		normalized.put('ắ', 'a');
		normalized.put('ấ', 'a');
		normalized.put('ằ', 'a');
		normalized.put('ầ', 'a');
		normalized.put('ẳ', 'a');
		normalized.put('ẩ', 'a');
		normalized.put('ẵ', 'a');
		normalized.put('ẫ', 'a');
		normalized.put('ặ', 'a');
		normalized.put('ậ', 'a');
		normalized.put('Ế', 'E');
		normalized.put('Ề', 'E');
		normalized.put('Ể', 'E');
		normalized.put('Ễ', 'E');
		normalized.put('Ệ', 'E');
		normalized.put('ế', 'e');
		normalized.put('ề', 'e');
		normalized.put('ể', 'e');
		normalized.put('ễ', 'e');
		normalized.put('ệ', 'e');
		normalized.put('Ố', 'O');
		normalized.put('Ớ', 'O');
		normalized.put('Ồ', 'O');
		normalized.put('Ờ', 'O');
		normalized.put('Ổ', 'O');
		normalized.put('Ở', 'O');
		normalized.put('Ỗ', 'O');
		normalized.put('Ỡ', 'O');
		normalized.put('Ộ', 'O');
		normalized.put('Ợ', 'O');
		normalized.put('ố', 'o');
		normalized.put('ớ', 'o');
		normalized.put('ồ', 'o');
		normalized.put('ờ', 'o');
		normalized.put('ổ', 'o');
		normalized.put('ở', 'o');
		normalized.put('ỗ', 'o');
		normalized.put('ỡ', 'o');
		normalized.put('ộ', 'o');
		normalized.put('ợ', 'o');
		normalized.put('Ứ', 'U');
		normalized.put('Ừ', 'U');
		normalized.put('Ử', 'U');
		normalized.put('Ữ', 'U');
		normalized.put('Ự', 'U');
		normalized.put('ứ', 'u');
		normalized.put('ừ', 'u');
		normalized.put('ử', 'u');
		normalized.put('ữ', 'u');
		normalized.put('ự', 'u');
	}

	public static String normalizeRunes(String text) {
		char[] chars = text.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			char r = chars[i];
			if (r < 0x00C0 || r > 0x2184) {
				continue;
			}
			Character n = normalized.get(r);
			if (n != null && r > 0) {
				chars[i] = n;
			}
		}
		return new String(chars);
	}
}
